package course;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 用到一个表Course
 * 在condao包里
 * connpool包下有一个接口CourseDao和一个类Druid
 * connpool包下又创建了一个包
 * 其下有一个类CourseDaoImpl
 * 来实现CourseDao接口
 * 一个.java源文件中可以定义多个class类
 * 编译时每个class类都应生成一个对应的class文件。
 * 一个*.java源文件中可以不用定义public class
 * 但一个源文件中最多只能包含一个public class
 * 多个时则报错。
 * 如果一个类声明的时候使用了public class进行了声明
 * 则类名称必须与文件名称完全一致
 * public class定义的是公共类
 * 所以文件名必须与类名一致
 * 其他类可以引入并使用其公共方法和属性
 *
 */

public class CourseDao {

    /**创建连接 localhost:1433;DatabaseName=数据库名
     * sql中的？代表占位符，  预处理执行器特有
     * 填充第几个？
     * 填充第一个
     * 填充第二个
     * 填充第三个
     * exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
     * 创建连接 localhost:1433;DatabaseName=数据库名
     * sql中的？代表占位符，  预处理执行器特有
     * exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
     * 创建连接 localhost:1433;DatabaseName=数据库名
     * sql中的？代表占位符，  预处理执行器特有
     * 根据课程编号进行查询， 返回课程的集合
     * 返回
     * @param slist
     * @throws SQLException
     */

    /**
     *     这个应该是你类中的set和get方法，说的白话一些，set方法是往对象里赋值，而get方法是从对象中取值，也就是说使用set方法我只需要知道需要参数的类型是什么就可以了，而get方法中我需要从对象中取到这个值，然后通过return反馈给用get方法取值的对象。
     * public class A{
     * int sno;
     * String name;
     * public int getSno(){
     * return sno;
     * }
     * public void setSno(int sno){
     * this.sno=sno;
     * }
     * public String getName(){
     * return name;
     * }
     * public void setName(String name){
     * this.name=name;
     * }
     * }
     * /**测试方法
     * public static void main(String[] args){
     * A a=new A();
     * a.setSno(1);
     * a.setName("job");
     * System.out.println("编号："+a.getSno()+" 姓名："+a.getName());
     * @param slist
     * @throws SQLException
     */
    public void insertAll(List<CoursePojo> slist) throws SQLException {

        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有

        for (int i = 1; i < slist.size(); i++) {
            //for循环语句
            CoursePojo item = slist.get(i);
            //获取数据
            String sql = "insert into course(cno, cname, cgrade, ctime) values(?, ?, ?, ?)";
            //SQL语句查询
            PreparedStatement ps = conn.prepareStatement(sql);
            // 填充第几个？
            ps.setString(1, item.getCno());
            //填充第一个
            ps.setString(2, item.getCname());
            //填充第二个
            ps.setInt(3, item.getCgrade());
            //填充第三个
            ps.setInt(4, item.getCtime());
            //填充第四个
            // 3
            // exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
            int rs = ps.executeUpdate();
            //更新
        }

        conn.close();
        //关闭

    }

    /**
     * 对于这个int，他是该类的成员属性，因为没有访问修饰符，所以java默认认为他是default，也就是只有在该类中能访问，其他地方不能访问。和private相似，区别不太清楚。
     * public class Text{
     * public int a;
     * 对于这个int，由于有public修饰
     * 所以这个变量对于所有类都是可见的
     * 没有访问的限制。
     * static，其实就是一个静态变量的意思
     * 用static修饰的变量又叫类变量
     * 他有很多特性，现在列出来
     * public static int a，对于这个变量
     * 首先他不需要一个实例化对象
     * 也就是说不需要new 对象就可以用类名+变量名来访问这个变量
     * 当然要看访问修饰符的限制。
     * 其次，这个变量是一个全局的变量
     * 就是这个对象被该类的其他所有对象共有。
     * @param cno
     * @return
     * @throws SQLException
     */

    public int deleteByCno(String cno) throws SQLException {
        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有
        String sql = "delete from Course where cno = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        // 填充第几个？
        ps.setString(1, cno);

        // 3
        // exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
        int rs = ps.executeUpdate();


        conn.close();
        return rs;
        //返回
    }


//    public List<CoursePojo> findStudentClassByCid(int cid) throws SQLException {
//        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
//        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
//        // sql中的？代表占位符，  预处理执行器特有
//        String sql = "select Con,Cname,Cgrade,Ctime" +
//                "from Course\n" +
//                "where cid= ?";
//
//        PreparedStatement ps = conn.prepareStatement(sql);
//        // 填充第几个？
//        ps.setInt(1, cid);
//
//        // 3
//        ArrayList<CoursePojo> slist = new ArrayList<>();
//        ResultSet rs = ps.executeQuery();
//        while (rs.next()) {
//            CoursePojo pojo = new CoursePojo();
//            slist.add(pojo);
//            pojo.setCon(rs.getString(1));
//            pojo.setCname(rs.getString(2));
//            pojo.setCgrade(rs.getInt(3));
//            pojo.setCtime(rs.getInt(4));
//
//        }
//        conn.close();
//        return slist;
//    }

    /**
     * 根据课程编号进行查询， 返回课程的集合
     *
     * @param cno   课程编号
     * @return 课程集合
     * @throws SQLException
     */
    public List<CoursePojo> findCourseClassByCid(String cno) throws SQLException {

        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有
        String sql = "select cno,cname,cgrade,ctime\n" +
                "from course\n" +
                "where cno=?";
        //查询课程号
        //查询课程名
        //查询成绩
        //查询学时

        PreparedStatement ps = conn.prepareStatement(sql);
        // 填充第几个？
        ps.setString(1, cno);

        // 3
        ArrayList<CoursePojo> slist = new ArrayList<>();
        //创建迭代
        ResultSet rs = ps.executeQuery();
        //返回结果值
        while (rs.next()) {
            //下一个
            CoursePojo pojo = new CoursePojo();
            //新课程
            slist.add(pojo);
            //添加
            pojo.setCno(rs.getString(1));
            //课程号
            pojo.setCname(rs.getString(2));
            //课程名称
            pojo.setCgrade(rs.getInt(3));
            //成绩
            pojo.setCtime(rs.getInt(4));
            //课时


        }
        conn.close();
        //关闭
        return slist;
        //返回


    }
}
